// 4工厂函数和泛型工厂函数.ts
class CommercialBank {
  public address: string = 'beijing'
  public name: string = 'wangwu'
  static count: number

  constructor(name: string, address: string) {
    // 日志文件 哪一个类被创建

    this.address = address
    this.name = name
  }
  loan(): void {
    console.log(this.name + ' 银行贷款')
  }
}
// 工厂函数 [一些不方便【比如说为每一个类对象创建时都打印一句，哪一个类被创建到文件或者直接打印在控制台上或者没有办法直接 new  类名（）格式来创建类对象]
// 通用的代码完全可用工厂函数搞定
//function createInstanceFactory(Constructor:new (...arg: any) => any) {
function createInstanceFactory(Constructor: { new (...arg: any): any }) {
  //分析 Constructor: { new (...arg: any): any }
  // 后面 { new (...arg: any): any } 这是构造函数的类型
  // 前面是 构造函数类型的对象变量
  console.log(Constructor.name + '被创建对象')
  return new Constructor('广大银行', '万绿园')
}
// 使用工厂函数来创建我们的 CommercialBank 对象
let con1 = createInstanceFactory(CommercialBank) // 这里应该传递 CommercialBank 跟下面的代码是一样的
// createInstanceFactory(Student) 后续可以创建 n个 不同的对象

// 2.工厂函数类型的简单使用
type ConstructorType = new (...arg: any) => any
let Constructor: ConstructorType = CommercialBank // new (...arg: any) => CommercialBank
// con 和 con2 效果是一样的
/**
 * 就相当于
 * function createInstanceFactory(Constructor:new (...arg: any) => any) {
 * function createInstanceFactory(Constructor: { new(...arg: any): any }) {
 */
let con = new Constructor('光大银行', 'admin')
let con2 = new CommercialBank('光大银行', 'admin')

// 3.泛型工厂函数
/**
 * let con = new Constructor('光大银行', 'admin') 和 let con1 = createInstanceFactory(CommercialBank) 这里鼠标放过去是 any 类型的
 * 但是这里我不想是any类型
 * 在运行的时候是会通过传递过来的值创建这个对象，但在编译期间这个函数本身内部是看不到外部的 所以 只能看到 Constructor: { new(...arg: any): any }
 * 返回的是 any 类型
 * 看这里 constructor CommercialBank(name: string, address: string): CommercialBank
 * new 出来的是由 CommercialBank 决定的
 * 所以 要使用泛型工厂函数
 */

type MyClassDecorator = <T>(targetClass: { new (...arg: any): T }) => T

function createInstanceFactory2<T>(Constructor: { new (...arg: any): T }): T {
  console.log(Constructor.name + '被创建对象')
  return new Constructor('广大银行', '万绿园')
}

let con3 = createInstanceFactory2<CommercialBank>(CommercialBank)

export {}
